#include "bib_Cache.h"

extern HANDLE heap;
extern struct REG_CACHE *inicioCache;

int crearCache(void){
	//Iniciar la cache vacia
	int i;
	struct REG_CACHE nodoNuevo;
	
	nodoNuevo.sector = REG_SIN_USO;
	strcpy(nodoNuevo.contenido, "");

	for(i = 0; i < TAM_CACHE; i++){
		if (agregarRegCache(REG_SIN_USO, "", heap)){
			imprimirLog(ERROR, "No se pudo crear la cache", "");////Tipo de error?
			EXIT_FAILURE;
		}
	}
	
	imprimirLog(INFO, "Cache creada", "");
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int destruirCache(){

	int i;
	
	for(i = 0; i < TAM_CACHE; i++)
		eliminarRegCache(heap);
		
	return EXIT_SUCCESS;
}
/*=====================================================================================*/
int leerDesdeCache(long dirLogica, char *datosSector){
	
	struct REG_CACHE *anterior = NULL;
	struct REG_CACHE *ptr = inicioCache;
	int cantLecturas = 0;
	char msg[DIGITOS_MAX_DIR_LOGICA + 1];

	while(ptr){
		cantLecturas++;
		if (ptr->sector != dirLogica){
			anterior = ptr;
			if (ptr->sector == (- 1))
				cantLecturas--;
			ptr = ptr->siguiente;
		}
		else
			break;
	}
		
	if (ptr){
		strcpy(datosSector, ptr->contenido);
		ponerAlFinal(anterior, ptr);
		sprintf(msg, "%d", dirLogica);
		imprimirLog(INFO, "Sector leido desde Cache:", msg);
		sprintf(msg, "%.2f ms", cantLecturas * TIEMPO_LECTURA_REG_CACHE);
		imprimirLog(INFO, "Tiempo consumido:", msg);
	}
	else
		strcpy(datosSector, "");

	return EXIT_SUCCESS;
}